package com;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 类型检查
 * 		编译过程中,检查数据类型是否匹配,
 * 
 * 什么是泛型 : 
 * 		集合实际上和数组一样,只能存储统一数据类型,只不过这个类型是Object,所有元素都会发生向上转型,所以导致什么都能放
 * 
 * 泛型不能使用基本数据类型,只能使用引用数据类型
 * 
 * 转型为多态之后,子类的属性就访问不到了,想要使用,必须向下转型,很麻烦
 * 
 * 类似于中药柜子
 * 
 * 优点 : 统一类型,减少类型转换
 * 缺点 : 只能存储单一类型的元素
 * 
 * @author lenovo
 * @Date 2020年7月18日
 * @Time 上午10:45:08
 */
public class Collection_18_Generic_01 {

	public static void main(String[] args) {
		Set s = new HashSet();
		A a = new A();
		B b = new B();
		C c = new C();
		s.add(a);
		s.add(b);
		s.add(c);

		for (Object object : s) {
//			A d = (A)object;
			if (object instanceof A) {
				A d = (A) object;
				d.m1();
			} else if (object instanceof B) {
				B d = (B) object;
				d.m1();
			}
		}
//		A 的 m1方法
//		B 的 m1方法

		List<D> ds = new ArrayList<D>();
		ds.add(a);
		ds.add(b);
		ds.add(c);
		for (D d : ds) {
			d.m1();
		}
//		A 的 m1方法
//		B 的 m1方法
//		C 的 m1方法
	}

}

interface D {
	public void m1();
}

class A implements D {
	public void m1() {
		System.out.println("A 的 m1方法");
	}
}

class B implements D {
	public void m1() {
		System.out.println("B 的 m1方法");
	}
}

class C implements D {
	public void m1() {
		System.out.println("C 的 m1方法");
	}
}